home *** CD-ROM | disk | FTP | other *** search
/ BMUG Revelations / BMUG Revelations.toast / Programming / Programming Languages / UCB Logo 3.0 / CSLS / math < prev    next >
Text File  |  1992-09-04  |  6KB  |  247 lines

  1. TO CATEGORY :NAME :MEMBERS
  2. PRINT (LIST "CATEGORY :NAME :MEMBERS)
  3. IF NOT NAMEP "CATEGORIES [MAKE "CATEGORIES []]
  4. MAKE "CATEGORIES LPUT :NAME :CATEGORIES
  5. MAKE :NAME :MEMBERS
  6. FOREACH :MEMBERS [PPROP ? "CATEGORY :NAME]
  7. END
  8.  
  9. TO CHOOSE :N :R
  10. OUTPUT (PERMS :N :R)/(FACT :R)
  11. END
  12.  
  13. TO CLEAN1 :CATEGORY
  14. FOREACH THING :CATEGORY [ERPL ?]
  15. ERN :CATEGORY
  16. END
  17.  
  18. TO CLEANUP
  19. FOREACH :CATEGORIES [CLEAN1 ?]
  20. ERN "CATEGORIES
  21. END
  22.  
  23. TO COMBS :LIST :HOWMANY
  24. IF EQUALP :HOWMANY 0 [OP [[]]]
  25. IF EQUALP :HOWMANY COUNT :LIST [OP (LIST :LIST)]
  26. OP SE (MAP [FPUT FIRST :LIST ?] COMBS (BF :LIST) (:HOWMANY-1)) ~
  27.       (COMBS (BF :LIST) :HOWMANY)
  28. END
  29.  
  30. TO DIFFER :LIST
  31. PRINT (LIST "DIFFER :LIST)
  32. FOREACH :LIST [DIFFER1 ? ?REST]
  33. END
  34.  
  35. TO DIFFER1 :WHO :THEM
  36. FOREACH :THEM ~
  37.         [IF NOT EQUALP (GPROP :WHO "CATEGORY) (GPROP ? "CATEGORY) ~
  38.             [FALSIFY :WHO ?]]
  39. END
  40.  
  41. TO EXPAND :LIST
  42. IF EMPTYP :LIST [OP []]
  43. IF NUMBERP FIRST :LIST ~
  44.    [OP CASCADE (FIRST :LIST) [FPUT FIRST BF :LIST ?] (EXPAND BF BF :LIST)]
  45. OP FPUT FIRST :LIST EXPAND BF :LIST
  46. END
  47.  
  48. TO F :N
  49. IF EQUALP :N 0 [OUTPUT 1]
  50. OUTPUT CASCADE :N [? + ((CHOOSE :N (#-1)) * F (#-1))] 0
  51. END
  52.  
  53. TO FACT :N
  54. OUTPUT CASCADE :N [# * ?] 1
  55. END
  56.  
  57. TO FALSES :WHO :WHAT
  58. OUTPUT COUNT FILTER [EQUALP "FALSE GET ? :WHAT] PEERS :WHO
  59. END
  60.  
  61. TO FALSIFY :WHO :WHAT
  62. LOCAL "OLDVALUE
  63. MAKE "OLDVALUE GET :WHO :WHAT
  64. IF EQUALP :OLDVALUE "FALSE [STOP]
  65. IF EQUALP :OLDVALUE "TRUE ~
  66.    [PR (SE [INCONSISTENCY FALSIFYING] :WHO "IS :WHAT) THROW "TOPLEVEL]
  67. PR (LIST "FALSIFY :WHO :WHAT)
  68. STORE :WHO :WHAT "FALSE
  69. IF NOT EMPTYP :OLDVALUE [LINKFALSE :OLDVALUE]
  70. IF EQUALP (COUNT PEERS :WHO) (1+FALSES :WHO :WHAT) [FINDTRUE :WHO :WHAT]
  71. IF EQUALP (COUNT PEERS :WHAT) (1+FALSES :WHAT :WHO) [FINDTRUE :WHAT :WHO]
  72. FOREACH (GPROP :WHO "TRUTH) [MAYBEFALSIFY ? :WHAT]
  73. FOREACH (GPROP :WHAT "TRUTH) [MAYBEFALSIFY :WHO ?]
  74. PPROP :WHO "FALSEHOOD (FPUT :WHAT GPROP :WHO "FALSEHOOD)
  75. PPROP :WHAT "FALSEHOOD (FPUT :WHO GPROP :WHAT "FALSEHOOD)
  76. END
  77.  
  78. TO FINDFALSE :THEM :WHAT
  79. FOREACH (FILTER [NOT EQUALP GET ? :WHAT "TRUE] :THEM) [FALSIFY ? :WHAT]
  80. END
  81.  
  82. TO FINDTRUE :WHO :WHAT
  83. VERIFY (FIND [NOT EQUALP "FALSE GET ? :WHAT] PEERS :WHO) :WHAT
  84. END
  85.  
  86. TO GET :A :B
  87. OUTPUT GETINORDER :A :B :CATEGORIES
  88. END
  89.  
  90. TO GETINORDER :A :B :ORDER
  91. IF EMPTYP :ORDER [PRINT (SE [UNKNOWN OBJECTS] :A :B) THROW "TOPLEVEL]
  92. IF MEMBERP :A THING FIRST :ORDER [OUTPUT GPROP :A :B]
  93. IF MEMBERP :B THING FIRST :ORDER [OUTPUT GPROP :B :A]
  94. OUTPUT GETINORDER :A :B BF :ORDER
  95. END
  96.  
  97. TO LINK :WHO :WHAT1 :WHAT2
  98. LOCAL "OLDVALUE
  99. MAKE "OLDVALUE GET :WHO :WHAT1
  100. IF EMPTYP :OLDVALUE [STORE :WHO :WHAT1 (LIST :WHO :WHAT2) STOP]
  101. IF EQUALP :OLDVALUE "TRUE [FALSIFY :WHO :WHAT2 STOP]
  102. IF EQUALP :OLDVALUE "FALSE [VERIFY :WHO :WHAT2 STOP]
  103. STORE :WHO :WHAT1 (SE :OLDVALUE :WHO :WHAT2)
  104. END
  105.  
  106. TO LINKFALSE :LIST
  107. IF EMPTYP :LIST [STOP]
  108. VERIFY (FIRST :LIST) (FIRST BF :LIST)
  109. LINKFALSE BF BF :LIST
  110. END
  111.  
  112. TO LINKTRUE :LIST
  113. IF EMPTYP :LIST [STOP]
  114. FALSIFY (FIRST :LIST) (FIRST BF :LIST)
  115. LINKTRUE BF BF :LIST
  116. END
  117.  
  118. TO LOCK1 :TOTAL :BUTTONS
  119. LOCAL "PERMS
  120. MAKE "PERMS PERMS :TOTAL :BUTTONS
  121. OUTPUT CASCADE (TWOTO (:BUTTONS-1)) [? + LOCK2 :PERMS #-1 1] 0
  122. END
  123.  
  124. TO LOCK2 :PERMS :LINKS :FACTOR
  125. IF EQUALP :LINKS 0 [OUTPUT :PERMS/(FACT :FACTOR)]
  126. IF EQUALP (REMAINDER :LINKS 2) 0 [OUTPUT LOCK2 :PERMS/(FACT :FACTOR) :LINKS/2 1]
  127. OUTPUT LOCK2 :PERMS (:LINKS-1)/2 :FACTOR+1
  128. END
  129.  
  130. TO LOCK :BUTTONS
  131. OUTPUT CASCADE :BUTTONS [? + LOCK1 :BUTTONS #] 1
  132. END
  133.  
  134. TO MAYBEFALSIFY :WHO :WHAT
  135. IF NOT EQUALP (GPROP :WHO "CATEGORY) (GPROP :WHAT "CATEGORY) [FALSIFY :WHO :WHAT]
  136. END
  137.  
  138. TO PEERS :WHO
  139. OUTPUT THING GPROP :WHO "CATEGORY
  140. END
  141.  
  142. TO PERMS :N :R
  143. IF EQUALP :R 0 [OUTPUT 1]
  144. OUTPUT :N * PERMS :N-1 :R-1
  145. END
  146.  
  147. TO PROBLEM
  148. CATEGORY "FIRST [JANE LARRY OPAL PERRY]
  149. CATEGORY "LAST [IRVING KING MENDLE NATHAN]
  150. CATEGORY "AGE [32 38 45 55]
  151. CATEGORY "JOB [DRAFTER PILOT SERGEANT DRIVER]
  152. DIFFER [JANE KING LARRY NATHAN]
  153. SAYS "JANE "IRVING 45
  154. SAYS "KING "PERRY "DRIVER
  155. SAYS "LARRY "SERGEANT 45
  156. SAYS "NATHAN "DRAFTER 38
  157. DIFFER [MENDLE JANE OPAL NATHAN]
  158. SAYS "MENDLE "PILOT "LARRY
  159. SAYS "JANE "PILOT 45
  160. SAYS "OPAL 55 "DRIVER
  161. SAYS "NATHAN 38 "DRIVER
  162. PRINT []
  163. SOLUTION
  164. END
  165.  
  166. TO SAYS :WHO :WHAT1 :WHAT2
  167. PRINT (LIST "SAYS :WHO :WHAT1 :WHAT2)
  168. LINK :WHO :WHAT1 :WHAT2
  169. LINK :WHO :WHAT2 :WHAT1
  170. END
  171.  
  172. TO SIMPLEX :BUTTONS
  173. OUTPUT 2 * F :BUTTONS
  174. END
  175.  
  176. TO SOCKS :LIST
  177. LOCAL [TOTAL MATCHING]
  178. MAKE "TOTAL COMBS (EXPAND :LIST) 2
  179. MAKE "MATCHING FILTER [EQUALP FIRST ? LAST ?] :TOTAL
  180. PR (SE [THERE ARE] COUNT :TOTAL [POSSIBLE PAIRS OF SOCKS.])
  181. PR (SE [OF THESE,] COUNT :MATCHING [ARE MATCHING PAIRS.])
  182. PR SE [PROBABILITY OF MATCH =] ~
  183.       WORD (100 * (COUNT :MATCHING)/(COUNT :TOTAL)) "%
  184. END
  185.  
  186. TO SOCKTEST
  187. LOCAL [FIRST SECOND]
  188. MAKE "FIRST PICK [BROWN BROWN BROWN BROWN BROWN BROWN BLUE BLUE BLUE BLUE]
  189. MAKE "SECOND ~
  190.      PICK (IFELSE EQUALP :FIRST "BROWN ~
  191.                   [[BROWN BROWN BROWN BROWN BROWN BLUE BLUE BLUE BLUE]] ~
  192.                   [[BROWN BROWN BROWN BROWN BROWN BROWN BLUE BLUE BLUE]])
  193. OUTPUT EQUALP :FIRST :SECOND
  194. END
  195.  
  196. TO SOLUTION
  197. FOREACH THING FIRST :CATEGORIES [SOLVE1 ? BF :CATEGORIES]
  198. END
  199.  
  200. TO SOLVE1 :WHO :ORDER
  201. TYPE :WHO
  202. FOREACH :ORDER [TYPE CHAR 32 TYPE GPROP :WHO ?]
  203. PRINT []
  204. END
  205.  
  206. TO STORE :A :B :VAL
  207. STOREINORDER :A :B :VAL :CATEGORIES
  208. END
  209.  
  210. TO STOREINORDER :A :B :VAL :ORDER
  211. IF EMPTYP :ORDER [PRINT (SE [UNKNOWN OBJECTS] :A :B) THROW "TOPLEVEL]
  212. IF MEMBERP :A THING FIRST :ORDER [PPROP :A :B :VAL STOP]
  213. IF MEMBERP :B THING FIRST :ORDER [PPROP :B :A :VAL STOP]
  214. STOREINORDER :A :B :VAL BF :ORDER
  215. END
  216.  
  217. TO T :N :K
  218. IF EQUALP :K 0 [OUTPUT 1]
  219. IF EQUALP :N 0 [OUTPUT 0]
  220. OUTPUT (T :N :K-1)+(T :N-1 :K)
  221. END
  222.  
  223. TO TWOTO :POWER
  224. OUTPUT CASCADE :POWER [2 * ?] 1
  225. END
  226.  
  227. TO VERIFY :WHO :WHAT
  228. LOCAL "OLDVALUE
  229. MAKE "OLDVALUE GET :WHO :WHAT
  230. IF EQUALP :OLDVALUE "TRUE [STOP]
  231. IF EQUALP :OLDVALUE "FALSE ~
  232.    [PR (SE [INCONSISTENCY VERIFYING] :WHO "IS :WHAT) THROW "TOPLEVEL]
  233. PR (LIST "VERIFY :WHO :WHAT)
  234. STORE :WHO :WHAT "TRUE
  235. PPROP :WHO (GPROP :WHAT "CATEGORY) :WHAT
  236. PPROP :WHAT (GPROP :WHO "CATEGORY) :WHO
  237. IF NOT EMPTYP :OLDVALUE [LINKTRUE :OLDVALUE]
  238. FINDFALSE (PEERS :WHO) :WHAT
  239. FINDFALSE (PEERS :WHAT) :WHO
  240. FOREACH (GPROP :WHO "TRUTH) [VERIFY ? :WHAT]
  241. FOREACH (GPROP :WHAT "TRUTH) [VERIFY :WHO ?]
  242. FOREACH (GPROP :WHO "FALSEHOOD) [MAYBEFALSIFY ? :WHAT]
  243. FOREACH (GPROP :WHAT "FALSEHOOD) [MAYBEFALSIFY :WHO ?]
  244. PPROP :WHO "TRUTH (FPUT :WHAT GPROP :WHO "TRUTH)
  245. PPROP :WHAT "TRUTH (FPUT :WHO GPROP :WHAT "TRUTH)
  246. END
  247.